package com.wrs.project.module.webrtc;

import android.content.Context;

import org.webrtc.CapturerObserver;
import org.webrtc.NV21Buffer;
import org.webrtc.SurfaceTextureHelper;
import org.webrtc.VideoCapturer;
import org.webrtc.VideoFrame;

import java.nio.ByteBuffer;

public  class CustomVideoCapture implements VideoCapturer {
    private CapturerObserver capturerObserver;
    private volatile boolean isCapturing = false;

    @Override
    public void initialize(SurfaceTextureHelper surfaceTextureHelper, Context context, CapturerObserver capturerObserver) {
        this.capturerObserver = capturerObserver;
    }

    @Override
    public void startCapture(int width, int height, int fps) {
        isCapturing = true;
        // 可以在这里启动自定义的视频源，例如从外部设备、屏幕录制等
        // 当有视频帧时，调用onFrame方法
        // 例如，我们可以模拟一个视频源，不断生成NV21格式的数据
        new Thread(() -> {
            while (isCapturing) {
                // 生成一帧NV21数据，这里假设生成一个渐变的颜色条
                byte[] nv21Data = generateNV21Frame(width, height);
                // 将NV21数据封装到ByteBuffer中
                ByteBuffer buffer = ByteBuffer.wrap(nv21Data);
                // 创建一个NV21Buffer，NV21Buffer会负责将NV21转换为I420（WebRTC内部使用）
                NV21Buffer nv21Buffer = new NV21Buffer(buffer.array(), width, height, null);
                // 创建视频帧，这里使用当前时间戳
                VideoFrame frame = new VideoFrame(nv21Buffer, 0, System.nanoTime());
                // 通知观察者新的一帧
                capturerObserver.onFrameCaptured(frame);
                // 释放帧，减少内存占用
                frame.release();

                try {
                    Thread.sleep(1000 / fps);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    @Override
    public void stopCapture() throws InterruptedException {
        isCapturing = false;
        // 停止视频源
    }

    @Override
    public void changeCaptureFormat(int i, int i1, int i2) {

    }

    @Override
    public void dispose() {

    }

    @Override
    public boolean isScreencast() {
        // 如果是屏幕录制，返回true，否则返回false
        return false;
    }

    // 假设我们有一个方法，当从自定义源得到一帧时调用此方法
    public void onFrame(byte[] data, int width, int height, int rotation) {
        if (!isCapturing) {
            return;
        }

        // 将数据封装到ByteBuffer中
        ByteBuffer buffer = ByteBuffer.wrap(data);

        // 创建一个NV21Buffer，这里假设数据是NV21格式，如果不是，需要根据实际格式处理
        NV21Buffer nv21Buffer = new NV21Buffer(data, width, height, null);

        // 创建VideoFrame，并传递旋转信息
        VideoFrame frame = new VideoFrame(nv21Buffer, rotation, System.nanoTime());

        // 通过observer将帧传递出去
        capturerObserver.onFrameCaptured(frame);

        // 释放帧，避免内存泄漏
        frame.release();
    }

    private byte[] generateNV21Frame(int width, int height) {
        // 生成NV21格式的视频帧。NV21格式是YUV420SP的一种，排列顺序为：首先是所有的Y，然后是VU交替。
        // 这里我们生成一个简单的渐变颜色条作为示例。
        int size = width * height * 3 / 2;
        byte[] data = new byte[size];
        int yIndex = 0;
        int uvIndex = width * height;

        // 生成YUV数据
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                // Y分量：使用渐变，从左上到右下由暗变亮
                data[yIndex++] = (byte) ((x + y) * 255 / (width + height));
            }
        }

        // 生成UV分量（NV21中UV交替存储，但这里我们简单处理，固定UV值）
        for (int i = 0; i < height / 2; i++) {
            for (int j = 0; j < width / 2; j++) {
                // U分量
                data[uvIndex++] = (byte) 128;
                // V分量
                data[uvIndex++] = (byte) 128;
            }
        }

        return data;
    }
}
